package com.lihang.rabbit1.config;

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.math.BigInteger;

/**
 * Jackson 配置类
 * 处理前端JS无法精确展示超过16位的长整型数字的问题
 */
@Configuration
public class JacksonConfig {

    /**
     * 自定义Jackson配置，将Long、BigInteger类型转为字符串
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> {
            // Long 类型转为字符串
            jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
            jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);
            // BigInteger 类型转为字符串
            jacksonObjectMapperBuilder.serializerByType(BigInteger.class, ToStringSerializer.instance);
        };
    }

//    /**
//     * 配置ObjectMapper
//     */
//    @Bean
//    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
//        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
//
//        // 忽略未知属性
//        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//
//        // 注册自定义模块处理大数值
//        SimpleModule simpleModule = new SimpleModule();
//        // 所有Long类型转为字符串
//        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
//        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
//        // BigInteger类型转为字符串
//        simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
//        // 超过16位的数值统一转为字符串
//        simpleModule.addSerializer(Long.class, new JsonSerializer<Long>() {
//            @Override
//            public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
//                if (value != null && value.toString().length() > 15) {
//                    gen.writeString(value.toString());
//                } else {
//                    gen.writeNumber(value);
//                }
//            }
//        });
//
//        objectMapper.registerModule(simpleModule);
//        return objectMapper;
//    }
}